package com.nd.android.u.ui.widge;

import android.app.Activity;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.common.android.utils.DisplayUtil;
import com.nd.android.u.ui.R;

/**
 * ClassName:PopNewMessage
 * Function: 新消息提醒类
 * Reason:	 在用户在浏览旧的聊天记录的时，如果来了新的聊天消息（属于当前会话的），
 * 会在底部菜单的上面出现一个气泡提醒，当用户点击这个气泡即跳到会话的底部;如果用户
 * 划屏滚动到新消息位置该气泡消失
 * 
 * @author   cb
 * @version  
 * @since    Ver 1.1
 * @Date	 2013	2013-6-8		下午2:23:45
 *
 * @see 	 
 */
public class PopNewMessage {
	private static final int WH=20; 		//气泡点击热区的长宽单位dip(不进行dip2px转换的话，在大分辨率手机上会变形)
	private int mViewWH = 40;
	private Context mContext;
	private PopupWindow mPopupWindow;
	private TextView mTextView;
	private View mParent;
	private int mCount=0;					//当前新消息的数量
	private int mLeftOffset;				//左偏移（用于确定气泡显示的位置）
	private int mTopOffset;
	private LinearLayout mLayout;
	public PopNewMessage(Context context){
		mContext=context;
		mViewWH = DisplayUtil.dip2px(mContext, WH);
		mParent=((Activity)mContext).getWindow().getDecorView();
		mLeftOffset=mParent.getWidth()/2-mViewWH;
		mTopOffset=mParent.getHeight()*4/10-mViewWH;
		initView();
	}
	
	private void initView(){
		mLayout=new LinearLayout(mContext);
		mTextView=new TextView(mContext);
		mTextView.setTextSize(10);
		mTextView.setGravity(Gravity.CENTER);
		mTextView.setTextColor(0xffffffff);
		mTextView.setPadding(5, 0, 5, 4);
		mTextView.setBackgroundResource(R.drawable.msgcount_bg);
		mLayout.addView(mTextView);
		mLayout.setGravity(Gravity.CENTER);
		mPopupWindow=new PopupWindow(mLayout, mViewWH,mViewWH);
	}
	
	/**
	 * @n<b>函数名称</b>     :setOnTextClickListener
	 * @brief 气泡的点击监听事件
	 * @see
	 * @since    Ver 1.1
	 * @param  @param listener
	 * @return void
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2013-6-8下午2:27:49      
	*/
	public void setOnTextClickListener(OnClickListener listener){
		mLayout.setOnClickListener(listener);
	}
	
	/**
	 * @n<b>函数名称</b>     :show
	 * @brief 显示气泡
	 * @see
	 * @since    Ver 1.1
	 * @param  @param value 新消息的数量，要和当前已有的新消息数相加
	 * @return void
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2013-6-8下午2:28:04      
	*/
	public void show(){
		mCount++;
		mTextView.setText(mCount+"");
		if (mPopupWindow.isShowing()){
			return;
		}
		if (!((Activity)mContext).isFinishing()){
			try {
				mPopupWindow.showAtLocation(mParent, Gravity.CENTER, mLeftOffset, mTopOffset);	
			} catch (Exception e) {
				//加了isFinishing判断还是会出现badToken异常……没辙了
			}
		}
	}
	
	/**
	 * @n<b>函数名称</b>     :dismiss
	 * @brief	关闭气泡
	 * @see
	 * @since    Ver 1.1
	 * @param  
	 * @return void
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2013-6-8下午2:28:51      
	*/
	public void dismiss(){
		mCount=0;
		if (mPopupWindow!=null){
			try {
				mPopupWindow.dismiss();	
			} catch (Exception e) {
			}
		}
	}
	
	/**
	 * @n<b>函数名称</b>     :isShowing
	 * @brief 气泡是否显示
	 * @see
	 * @since    Ver 1.1
	 * @param  @return
	 * @return boolean
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2013-6-8下午2:29:11      
	*/
	public boolean isShowing(){
		return mPopupWindow!=null && mPopupWindow.isShowing();
	}
	
	/**
	 * @n<b>函数名称</b>     :getCount
	 * @brief 当前未读消息的数量
	 * @see
	 * @since    Ver 1.1
	 * @param  @return
	 * @return int
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2013-6-8下午2:29:20      
	*/
	public int getCount(){
		return mCount;
	}
}
